<?php
	/**
	 * Created by PhpStorm.
	 * User: mybook-lhp
	 * Date: 18/2/6
	 * Time: 上午10:03
	 */

	namespace app\common\utils;

	/**
	 * /*
	 * $file = new file();
	 * $file_path = 'C:/Documents and Settings/Administrator/桌面/phpThumb_1.7.10-201104242100-beta';
	 * $files = 'C:/Documents and Settings/Administrator/桌面/phpThumb_1.7.10-201104242100-beta/index.php';
	 * $create_path = 'D:/这是创建的目录/哈哈/爱/的/味道/是/雪儿/给的/';
	 * echo '创建文件夹:create_dir()<br>';
	 * //if($file->create_dir($create_path)) echo '创建目录成功'; else '创建目录失败';
	 * echo '<hr>创建文件:create_file()<br>';
	 * //if($file->create_file($create_path.'创建的文件.txt',true,strtotime('1988-05-04'),strtotime('1988-05-04'))) echo '创建文件成功!'; else echo '创建文件失败!';
	 * echo '<hr>删除非空目录:remove_dir()<br>';
	 * //if($file->remove_dir($file_path,true)) echo '删除非空目录成功!'; else echo '删除非空目录失败!';
	 * echo '<hr>取得文件完整名称(带后缀名):get_basename()<br>';
	 * //echo $file->get_basename($files);
	 * echo '<hr>取得文件后缀名:get_ext()<br>';
	 * //echo $file->get_ext($files);
	 * echo '<hr>取得上N级目录:father_dir()<br>';
	 * //echo $file->father_dir($file_path,3);
	 * echo '<hr>删除文件:unlink_file()<br>';
	 * //if($file->unlink_file($file_path.'/index.php')) echo '删除文件成功!'; else '删除文件失败!';
	 * echo '<hr>操作文件:handle_file()<br>';
	 * //if($file->handle_file($file_path.'/index.php',$create_path.'/index.php','copy',true)) echo '复制文件成功!'; else echo '复制文件失败!';
	 * //if($file->handle_file($file_path.'/index.php', $create_path.'/index.php','move',true)) echo '文件移动成功!'; else echo '文件移动失败!';
	 * echo '<hr>操作文件夹:handle_dir()<br>';
	 * //if($file->handle_dir($file_path,$create_path,'copy',true)) echo '复制文件夹成功!'; else echo '复制文件夹失败!';
	 * //if($file->handle_dir($file_path,$create_path,'move',true)) echo '移动文件夹成功!'; else echo '移动文件夹失败!';
	 * echo '<hr>取得文件夹信息:get_dir_info()<br>';
	 * //print_r($file->get_dir_info($create_path));
	 * echo '<hr>替换统一格式路径:dir_replace()<br>';
	 * //echo $file->dir_replace("c:\d/d\e/d\h");
	 * echo '<hr>取得指定模板文件:get_templtes()<br>';
	 * //echo $file->get_templtes($create_path.'/index.php');
	 * echo '<hr>取得指定条件的文件夹中的文件:list_dir_info()<br>';
	 * //print_r($file->list_dir_info($create_path,true));
	 * echo '<hr>取得文件夹信息:dir_info()<br>';
	 * //print_r($file->dir_info($create_path));
	 * echo '<hr>判断文件夹是否为空:is_empty()<br>';
	 * //if($file->is_empty($create_path)) echo '不为空'; else echo'为空';
	 * echo '<hr>返回指定文件和目录的信息:list_info()<br>';
	 * //print_r($file->list_info($create_path));
	 * echo '<hr>返回关于打开文件的信息:open_info()<br>';
	 * //print_r($file->open_info($create_path.'/index.php'));
	 * echo '<hr>取得文件路径信息:get_file_type()<br>';
	 * //print_r($file->get_file_type($create_path));
	 * */

	/**
	 * Class UtilFiles
	 * @package app\common\Utils
	 */
	class UtilFiles
	{
		static protected $Instance = null;

		/**
		 * 单例模式实例
		 * @return null
		 */
		static public function Instance()
		{
			if (static::$Instance == null)
			{
				static::$Instance = new static();
			}

			return static::$Instance;
		}

		/**
		 * 创建多级目录
		 * 目录不存在则自动创建
		 * @param string $dir
		 * @param int $mode
		 * @return boolean
		 */
		public function create_dir($dir, $mode = 0777)
		{
			return is_dir($dir) or ($this->create_dir(dirname($dir)) and mkdir($dir, $mode));
		}

		/**
		 * 创建指定路径下的指定文件
		 * @param string $path (需要包含文件名和后缀)
		 * @param boolean $over_write 是否覆盖文件
		 * @param int $time 设置时间。默认是当前系统时间
		 * @param int $atime 设置访问时间。默认是当前系统时间
		 * @return boolean
		 */
		public function create_file($path, $over_write = FALSE, $time = NULL, $atime = NULL)
		{
			$path = $this->dir_replace($path);
			$time = empty($time) ? time() : $time;
			$atime = empty($atime) ? time() : $atime;
			if (file_exists($path) && $over_write)
			{
				$this->unlink_file($path);
			}
			$aimDir = dirname($path);
			$this->create_dir($aimDir);
			return touch($path, $time, $atime);
		}

		/**
		 * 关闭文件操作
		 * @param string $path
		 * @return boolean
		 */
		public function close($path)
		{
			return fclose($path);
		}

		/**
		 * 读取文件操作
		 * @param string $file
		 * @return boolean
		 */
		public function read_file($file)
		{
			return @file_get_contents($file);
		}

		/**
		 * 确定服务器的最大上传限制（字节数）
		 * @return int 服务器允许的最大上传字节数
		 */
		public function allow_upload_size()
		{
			$val = trim(ini_get('upload_max_filesize'));
			return $val;
		}

		/**
		 * 字节格式化 把字节数格式为 B K M G T P E Z Y 描述的大小
		 * @param int $size 大小
		 * @param int $dec 显示类型
		 * @return int
		 */
		public function byte_format($size, $dec = 2)
		{
			$a = array("B", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB");
			$pos = 0;
			while ($size >= 1024)
			{
				$size /= 1024;
				$pos ++;
			}
			return round($size, $dec) . " " . $a[$pos];
		}

		/**
		 * 删除非空目录
		 * 说明:只能删除非系统和特定权限的文件,否则会出现错误
		 * @param string $dirName 目录路径
		 * @param boolean $is_all 是否删除所有
		 * @param boolean $del_dir 是否删除目录
		 * @return boolean
		 */
		public function remove_dir($dir_path, $is_all = FALSE)
		{
			$dirName = $this->dir_replace($dir_path);
			$handle = @opendir($dirName);
			while (($file = @readdir($handle)) !== FALSE)
			{
				if ($file != '.' && $file != '..')
				{
					$dir = $dirName . '/' . $file;
					if ($is_all)
					{
						is_dir($dir) ? $this->remove_dir($dir) : $this->unlink_file($dir);
					} else
					{
						if (is_file($dir))
						{
							$this->unlink_file($dir);
						}
					}
				}
			}
			closedir($handle);
			return @rmdir($dirName);
		}

		/**
		 * 获取完整文件名
		 * @param string $fn 路径
		 * @return string
		 */
		public function get_basename($file_path)
		{
			$file_path = $this->dir_replace($file_path);
			return basename(str_replace('\\', '/', $file_path));
			//return pathinfo($file_path,PATHINFO_BASENAME);
		}

		/**
		 * 获取文件后缀名
		 * @param string $file_name 文件路径
		 * @return string
		 */
		public function get_ext($file)
		{
			$file = $this->dir_replace($file);
			//return strtolower(substr(strrchr(basename($file), '.'),1));
			//return end(explode(".",$filename ));
			//return strtolower(trim(array_pop(explode('.', $file))));//取得后缀
			//return preg_replace('/.*\.(.*[^\.].*)*/iU','\\1',$file);
			return pathinfo($file, PATHINFO_EXTENSION);
		}

		/**
		 * 取得指定目录名称
		 * @param string $path 文件路径
		 * @param int $num 需要返回以上级目录的数
		 * @return string
		 */
		public function father_dir($path, $num = 1)
		{
			$path = $this->dir_replace($path);
			$arr = explode('/', $path);
			if ($num == 0 || count($arr) < $num)
				return pathinfo($path, PATHINFO_BASENAME);
			return substr(strrev($path), 0, 1) == '/' ? $arr[(count($arr) - (1 + $num))] : $arr[(count($arr) - $num)];
		}

		/**
		 * 删除文件
		 * @param string $path
		 * @return boolean
		 */
		public function unlink_file($path)
		{
			$path = $this->dir_replace($path);
			if (file_exists($path))
			{
				return unlink($path);
			}
		}

		/**
		 * 文件操作(复制/移动)
		 * @param string $old_path 指定要操作文件路径(需要含有文件名和后缀名)
		 * @param string $new_path 指定新文件路径（需要新的文件名和后缀名）
		 * @param string $type 文件操作类型
		 * @param boolean $overWrite 是否覆盖已存在文件
		 * @return boolean
		 */
		public function handle_file($old_path, $new_path, $type = 'copy', $overWrite = FALSE)
		{
			$old_path = $this->dir_replace($old_path);
			$new_path = $this->dir_replace($new_path);
			if (file_exists($new_path) && $overWrite = FALSE)
			{
				return FALSE;
			} else if (file_exists($new_path) && $overWrite = TRUE)
			{
				$this->unlink_file($new_path);
			}

			$aimDir = dirname($new_path);
			$this->create_dir($aimDir);
			switch ($type)
			{
				case 'copy':
					return copy($old_path, $new_path);
					break;
				case 'move':
					return rename($old_path, $new_path);
					break;
			}
		}

		/**
		 * 文件夹操作(复制/移动)
		 * @param string $old_path 指定要操作文件夹路径
		 * @param string $aimDir 指定新文件夹路径
		 * @param string $type 操作类型
		 * @param boolean $overWrite 是否覆盖文件和文件夹
		 * @return boolean
		 */
		public function handle_dir($old_path, $new_path, $type = 'copy', $overWrite = FALSE)
		{
			$new_path = $this->check_path($new_path);
			$old_path = $this->check_path($old_path);
			if (!is_dir($old_path))
				return FALSE;

			if (!file_exists($new_path))
				$this->create_dir($new_path);

			$dirHandle = opendir($old_path);

			if (!$dirHandle)
				return FALSE;

			$boolean = TRUE;

			while (FALSE !== ($file = readdir($dirHandle)))
			{
				if ($file == '.' || $file == '..')
					continue;

				if (!is_dir($old_path . $file))
				{
					$boolean = $this->handle_file($old_path . $file, $new_path . $file, $type, $overWrite);
				} else
				{
					$this->handle_dir($old_path . $file, $new_path . $file, $type, $overWrite);
				}
			}
			switch ($type)
			{
				case 'copy':
					closedir($dirHandle);
					return $boolean;
					break;
				case 'move':
					closedir($dirHandle);
					return rmdir($old_path);
					break;
			}
		}

		/**
		 * 替换相应的字符
		 * @param string $path 路径
		 * @return string
		 */
		public function dir_replace($path)
		{
			return str_replace('//', '/', str_replace('\\', '/', $path));
		}

		/**
		 * 读取指定路径下模板文件
		 * @param string $path 指定路径下的文件
		 * @return string $rstr
		 */
		public function get_templtes($path)
		{
			$path = $this->dir_replace($path);
			if (file_exists($path))
			{
				$fp = fopen($path, 'r');
				$rstr = fread($fp, filesize($path));
				fclose($fp);
				return $rstr;
			} else
			{
				return '';
			}
		}

		/**
		 * 文件重命名
		 * @param string $oldname
		 * @param string $newname
		 */
		public function rename($oldname, $newname)
		{
			if (($newname != $oldname) && is_writable($oldname))
			{
				return rename($oldname, $newname);
			}
		}

		/**
		 * 获取指定路径下的信息
		 * @param string $dir 路径
		 * @return ArrayObject
		 */
		public function get_dir_info($dir)
		{
			$handle = @opendir($dir);//打开指定目录
			$directory_count = 0;
			$total_size = 0;
			$file_cout = 0;
			while (FALSE !== ($file_path = readdir($handle)))
			{
				if ($file_path != "." && $file_path != "..")
				{
					//is_dir("$dir/$file_path") ? $sizeResult += $this->get_dir_size("$dir/$file_path") : $sizeResult += filesize("$dir/$file_path");
					$next_path = $dir . '/' . $file_path;
					if (is_dir($next_path))
					{
						$directory_count ++;
						$result_value = self::get_dir_info($next_path);
						$total_size += $result_value['size'];
						$file_cout += $result_value['filecount'];
						$directory_count += $result_value['dircount'];
					} elseif (is_file($next_path))
					{
						$total_size += filesize($next_path);
						$file_cout ++;
					}
				}
			}
			closedir($handle);//关闭指定目录
			$result_value['size'] = $total_size;
			$result_value['filecount'] = $file_cout;
			$result_value['dircount'] = $directory_count;
			return $result_value;
		}

		/**
		 * 指定文件编码转换
		 * @param string $path 文件路径
		 * @param string $input_code 原始编码
		 * @param string $out_code 输出编码
		 * @return boolean
		 */
		public function change_file_code($path, $input_code, $out_code)
		{
			if (is_file($path))//检查文件是否存在,如果存在就执行转码,返回真
			{
				$content = file_get_contents($path);
				$content = string::chang_code($content, $input_code, $out_code);
				$fp = fopen($path, 'w');
				return fputs($fp, $content) ? TRUE : FALSE;
				fclose($fp);
			}
		}

		/**
		 * 指定目录下指定条件文件编码转换
		 * @param string $dirname 目录路径
		 * @param string $input_code 原始编码
		 * @param string $out_code 输出编码
		 * @param boolean $is_all 是否转换所有子目录下文件编码
		 * @param string $exts 文件类型
		 * @return boolean
		 */
		public function change_dir_files_code($dirname, $input_code, $out_code, $is_all = TRUE, $exts = '')
		{
			if (is_dir($dirname))
			{
				$fh = opendir($dirname);
				while (($file = readdir($fh)) !== FALSE)
				{
					if (strcmp($file, '.') == 0 || strcmp($file, '..') == 0)
					{
						continue;
					}
					$filepath = $dirname . '/' . $file;

					if (is_dir($filepath) && $is_all == TRUE)
					{
						$files = $this->change_dir_files_code($filepath, $input_code, $out_code, $is_all, $exts);
					} else
					{
						if ($this->get_ext($filepath) == $exts && is_file($filepath))
						{
							$boole = $this->change_file_code($filepath, $input_code, $out_code, $is_all, $exts);
							if (!$boole)
								continue;
						}
					}
				}
				closedir($fh);
				return TRUE;
			} else
			{
				return FALSE;
			}
		}

		/**
		 * 列出指定目录下符合条件的文件和文件夹
		 * @param string $dirname 路径
		 * @param boolean $is_all 是否列出子目录中的文件
		 * @param string $exts 需要列出的后缀名文件
		 * @param string $sort 数组排序
		 * @return ArrayObject
		 */
		public function list_dir_info($dirname, $is_all = FALSE, $exts = '', $sort = 'ASC')
		{
			//处理多于的/号
			$new = strrev($dirname);
			if (strpos($new, '/') == 0)
			{
				$new = substr($new, 1);
			}
			$dirname = strrev($new);

			$sort = strtolower($sort);//将字符转换成小写

			$files = array();
			$subfiles = array();

			if (is_dir($dirname))
			{
				$fh = opendir($dirname);
				while (($file = readdir($fh)) !== FALSE)
				{
					if (strcmp($file, '.') == 0 || strcmp($file, '..') == 0)
						continue;

					$filepath = $dirname . '/' . $file;

					switch ($exts)
					{
						case '*':
							if (is_dir($filepath) && $is_all == TRUE)
							{
								$files = array_merge($files, self::list_dir_info($filepath, $is_all, $exts, $sort));
							}
							array_push($files, $filepath);
							break;
						case 'folder':
							if (is_dir($filepath) && $is_all == TRUE)
							{
								$files = array_merge($files, self::list_dir_info($filepath, $is_all, $exts, $sort));
								array_push($files, $filepath);
							} elseif (is_dir($filepath))
							{
								array_push($files, $filepath);
							}
							break;
						case 'file':
							if (is_dir($filepath) && $is_all == TRUE)
							{
								$files = array_merge($files, self::list_dir_info($filepath, $is_all, $exts, $sort));
							} elseif (is_file($filepath))
							{
								array_push($files, $filepath);
							}
							break;
						default:
							if (is_dir($filepath) && $is_all == TRUE)
							{
								$files = array_merge($files, self::list_dir_info($filepath, $is_all, $exts, $sort));
							} elseif (preg_match("/\.($exts)/i", $filepath) && is_file($filepath))
							{
								array_push($files, $filepath);
							}
							break;
					}

					switch ($sort)
					{
						case 'asc':
							sort($files);
							break;
						case 'desc':
							rsort($files);
							break;
						case 'nat':
							natcasesort($files);
							break;
					}
				}
				closedir($fh);
				return $files;
			} else
			{
				return FALSE;
			}
		}

		/**
		 * 返回指定路径的文件夹信息，其中包含指定路径中的文件和目录
		 * @param string $dir
		 * @return ArrayObject
		 */
		public function dir_info($dir)
		{
			return scandir($dir);
		}

		/**
		 * 判断目录是否为空
		 * @param string $dir
		 * @return boolean
		 */
		public function is_empty($dir)
		{
			$handle = opendir($dir);
			while (($file = readdir($handle)) !== false)
			{
				if ($file != '.' && $file != '..')
				{
					closedir($handle);
					return true;
				}
			}
			closedir($handle);
			return false;
		}

		/**
		 * 返回指定文件和目录的信息
		 * @param $file
		 * @return array
		 */
		public function FileInfo($file)
		{

			if (!file_exists($file))
			{
				return ['error' => '路径错误或文件不存在!'];
			}
			$dir = array();
			$dir['filename'] = basename($file);//返回路径中的文件名部分。
			$dir['onlyname'] = $this->onlyname(basename($file)); //返回路径中的文件名部分。
			$dir['pathname'] = realpath($file);//返回绝对路径名。
			$dir['owner'] = fileowner($file);//文件的 user ID （所有者）。
			$dir['perms'] = fileperms($file);//返回文件的 inode 编号。
			$dir['inode'] = fileinode($file);//返回文件的 inode 编号。
			$dir['group'] = filegroup($file);//返回文件的组 ID。
			$dir['path'] = dirname($file);//返回路径中的目录名称部分。
			$dir['atime'] = fileatime($file);//返回文件的上次访问时间。
			$dir['ctime'] = filectime($file);//返回文件的上次改变时间。
			$dir['perms'] = fileperms($file);//返回文件的权限。
			$dir['size'] = filesize($file);//返回文件大小。
			$dir['type'] = filetype($file);//返回文件类型。
			$dir['ext'] = is_file($file) ? pathinfo($file, PATHINFO_EXTENSION) : '';//返回文件后缀名
			$dir['mtime'] = filemtime($file);//返回文件的上次修改时间。
			$dir['isDir'] = is_dir($file);//判断指定的文件名是否是一个目录。
			$dir['isFile'] = is_file($file);//判断指定文件是否为常规的文件。
			$dir['isLink'] = is_link($file);//判断指定的文件是否是连接。
			$dir['isReadable'] = is_readable($file);//判断文件是否可读。
			$dir['isWritable'] = is_writable($file);//判断文件是否可写。
			$dir['isUpload'] = is_uploaded_file($file);//判断文件是否是通过 HTTP POST 上传的。
			return $dir;
		}

		/**
		 * 获取文件目录下的
		 * @param $path
		 * @return array
		 */
		public function getPathDName($path)
		{
			$names = scandir($path);
			unset($names[0]);
			unset($names[1]);
			$name = [];
			foreach ($names as $item)
			{
				if (is_dir($path . $item))
				{
					$name[] = $item;
				}
			}
			return $name;
		}

		/**
		 * 或取文件名称-不含后缀
		 * @param $name
		 * @return mixed
		 */
		public function onlyname($name)
		{
			return explode('.', $name)[0];
		}

		/**
		 * 返回关于打开文件的信息
		 * @param $file
		 * @return ArrayObject
		 * 数字下标     关联键名（自 PHP 4.0.6）     说明
		 * 0     dev     设备名
		 * 1     ino     号码
		 * 2     mode     inode 保护模式
		 * 3     nlink     被连接数目
		 * 4     uid     所有者的用户 id
		 * 5     gid     所有者的组 id
		 * 6     rdev     设备类型，如果是 inode 设备的话
		 * 7     size     文件大小的字节数
		 * 8     atime     上次访问时间（Unix 时间戳）
		 * 9     mtime     上次修改时间（Unix 时间戳）
		 * 10     ctime     上次改变时间（Unix 时间戳）
		 * 11     blksize     文件系统 IO 的块大小
		 * 12     blocks     所占据块的数目
		 */
		public function open_info($file)
		{
			$file = fopen($file, "r");
			$result = fstat($file);
			fclose($file);
			return $result;
		}

		/**
		 * 改变文件和目录的相关属性
		 * @param string $file 文件路径
		 * @param string $type 操作类型
		 * @param string $ch_info 操作信息
		 * @return bool
		 */
		public function change_file($file, $type, $ch_info)
		{
			$is_ok = false;
			switch ($type)
			{
				case 'group' :
					$is_ok = chgrp($file, $ch_info);//改变文件组。
					break;
				case 'mode' :
					$is_ok = chmod($file, $ch_info);//改变文件模式。
					break;
				case 'ower' :
					$is_ok = chown($file, $ch_info);//改变文件所有者。
					break;
			}

			return $is_ok;
		}

		/**
		 * 取得文件路径信息
		 * @param $path string  完整路径
		 * @return mixed
		 */
		public function get_file_type($path)
		{
			$fileinfo = $this->FileInfo($path);

			return $fileinfo['pathname'];
		}

		/**
		 * 取得上传文件信息
		 * @param $file file属性信息
		 * @return array
		 */
		public function get_upload_file_info($file)
		{
			$file_info = $_FILES[$file];//取得上传文件基本信息
			$info = array();
			$info['type'] = strtolower(trim(stripslashes(preg_replace("/^(.+?);.*$/", "\\1", $file_info['type'])), '"'));//取得文件类型
			$info['temp'] = $file_info['tmp_name'];//取得上传文件在服务器中临时保存目录
			$info['size'] = $file_info['size'];//取得上传文件大小
			$info['error'] = $file_info['error'];//取得文件上传错误
			$info['name'] = $file_info['name'];//取得上传文件名
			$info['ext'] = $this->get_ext($file_info['name']);//取得上传文件后缀
			return $info;
		}

		/**
		 * 设置文件命名规则
		 * @param string $type 命名规则
		 * @param string $filename 文件名
		 * @return string
		 */
		public function set_file_name($type)
		{
			switch ($type)
			{
				case 'hash' :
					$new_file = md5(uniqid(mt_rand()));//mt_srand()以随机数md5加密来命名
					break;
				case 'time' :
					$new_file = time();
					break;
				default :
					$new_file = date($type, time());//以时间格式来命名
					break;
			}
			return $new_file;
		}

		/**
		 * 文件保存路径处理
		 * @return string
		 */
		public function check_path($path)
		{
			return (preg_match('/\/$/', $path)) ? $path : $path . '/';
		}

		public function down_remote_file($url, $save_dir = '', $filename = '', $type = 0)
		{

			if (trim($url) == '')
			{
				return array('file_name' => '', 'save_path' => '', 'error' => 1);
			}
			if (trim($save_dir) == '')
			{
				$save_dir = './';
			}
			if (trim($filename) == '')
			{//保存文件名
				$ext = strrchr($url, '.');
				//    if($ext!='.gif'&&$ext!='.jpg'){
				//        return array('file_name'=>'','save_path'=>'','error'=>3);
				//    }
				$filename = time() . $ext;
			}
			if (0 !== strrpos($save_dir, '/'))
			{
				$save_dir .= '/';
			}
			//创建保存目录
			if (!file_exists($save_dir) && !mkdir($save_dir, 0777, true))
			{
				return array('file_name' => '', 'save_path' => '', 'error' => 5);
			}
			//获取远程文件所采用的方法
			if ($type)
			{
				$ch = curl_init();
				$timeout = 5;
				curl_setopt($ch, CURLOPT_URL, $url);
				curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
				curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
				$img = curl_exec($ch);
				curl_close($ch);
			} else
			{
				ob_start();
				readfile($url);
				$img = ob_get_contents();
				ob_end_clean();
			}
			//$size=strlen($img);
			//文件大小
			$fp2 = fopen($save_dir . $filename, 'a');

			fwrite($fp2, $img);
			fclose($fp2);
			unset($img, $url);
			return array('file_name' => $filename, 'save_path' => $save_dir . $filename, 'error' => 0);
		}

		/**
		 * 获取目录下面的文件名以及子目录下的文件名
		 * @param $dir
		 * @return array
		 */
		static function getDir($dir)
		{
			$data = array();
			self::searchDir($dir, $data);
			return $data;
		}

		static function searchDir($path, &$data)
		{
			if (is_dir($path))
			{
				$dp = dir($path);
				while ($file = $dp->read())
				{
					if ($file != '.' && $file != '..')
					{
						self::searchDir($path . '/' . $file, $data);
					}
				}
				$dp->close();
			}
			if (is_file($path))
			{
				$data[] = $path;
			}
		}

	}